package com.huiquan.framework.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

@Component
public class FileUtils {

	@Value("${file.backup.pre}")
	private String fileBackupPre;
	private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class);

	/**
	 * 根据输出的路径和内容导出文件
	 * 
	 * @param filePath
	 * @throws Exception
	 */
	public static void generateFile(String filePath, String content) throws Exception {
		BufferedOutputStream bos = null;

		try {
			File file = createFile(filePath);

			bos = new BufferedOutputStream(new FileOutputStream(file));

			if (content == null) {
				content = "";
			}
			bos.write(content.getBytes("utf-8"));
		} catch (Exception e) {
			LOGGER.error("generateFile error");
			e.printStackTrace();
			throw e;
		} finally {
			bos.flush();
			bos.close();
		}
	}

	/**
	 * 根据路径生成目录和文件
	 * 
	 * @param filePath
	 * @return
	 */
	public static File createFile(String filePath) throws Exception {
		File file = new File(filePath);

		// 初始化上级目录
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}

		// 新建文件
		if (file.exists()) {
			file.delete();
		}
		file.createNewFile();
		return file;
	}

	public void backupImportFile(MultipartFile mFile, String projectName, String fileName) {
		try {
			// 设置文件路径名称
			String pathname = fileBackupPre + projectName + "/" + fileName;

			// 将上传的文件备份到备份路径下
			File file = new File(pathname);
			// 初始化上级目录
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}

			mFile.transferTo(file);

			LOGGER.info("backupImportFile success!pathname = " + pathname);
		} catch (Exception e) {
			LOGGER.error("backupImportFile error");
			e.printStackTrace();
		}
	}



		/**
		 * 删除文件，可以是文件或文件夹
		 *
		 * @param fileName
		 *            要删除的文件名
		 * @return 删除成功返回true，否则返回false
		 */
		public static boolean delete(String fileName) {
			File file = new File(fileName);
			if (!file.exists()) {
				LOGGER.error("删除文件失败:" + fileName + "不存在！");
				return false;
			} else {
				if (file.isFile())
					return deleteFile(fileName);
				else
					return deleteDirectory(fileName);
			}
		}

		/**
		 * 删除单个文件
		 *
		 * @param fileName
		 *            要删除的文件的文件名
		 * @return 单个文件删除成功返回true，否则返回false
		 */
		public static boolean deleteFile(String fileName) {
			File file = new File(fileName);
			// 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
			if (file.exists() && file.isFile()) {
				if (file.delete()) {
					LOGGER.info("删除单个文件" + fileName + "成功！");
					return true;
				} else {
					LOGGER.error("删除单个文件" + fileName + "失败！");
					return false;
				}
			} else {
				LOGGER.error("删除单个文件失败：" + fileName + "不存在！");
				return false;
			}
		}

		/**
		 * 删除目录及目录下的文件
		 *
		 * @param dir
		 *            要删除的目录的文件路径
		 * @return 目录删除成功返回true，否则返回false
		 */
		public static boolean deleteDirectory(String dir) {
			// 如果dir不以文件分隔符结尾，自动添加文件分隔符
			if (!dir.endsWith(File.separator))
				dir = dir + File.separator;
			File dirFile = new File(dir);
			// 如果dir对应的文件不存在，或者不是一个目录，则退出
			if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
				LOGGER.error("删除目录失败：" + dir + "不存在！");
				return false;
			}
			boolean flag = true;
			// 删除文件夹中的所有文件包括子目录
			File[] files = dirFile.listFiles();
			for (int i = 0; i < files.length; i++) {
				// 删除子文件
				if (files[i].isFile()) {
					flag = FileUtils.deleteFile(files[i].getAbsolutePath());
					if (!flag)
						break;
				}
				// 删除子目录
				else if (files[i].isDirectory()) {
					flag = FileUtils.deleteDirectory(files[i]
							.getAbsolutePath());
					if (!flag)
						break;
				}
			}
			if (!flag) {
				LOGGER.error("删除目录失败！");
				return false;
			}
			// 删除当前目录
			if (dirFile.delete()) {
				LOGGER.info("删除目录" + dir + "成功！");
				return true;
			} else {
				return false;
			}
		}



}
